package reflect;

import java.lang.reflect.Method;

/**
 * 反射机制
 *  获取Method对象的方法：
 *  1.getMethod (String name, Class <?>... parameterTypes);
 *  获取某个指定的成员方法对象
 *  注意，如果成员函数是带参的，那么后边这个ParameterTypes就得传入这个参数的对应形式的字节码文件对象,比如写上int.class
 */
public class ReflectDemo5 {
    public static void main(String[] args) throws Exception{
        Person p = new Person();
        p.sayHello();//传统正常方式调用Person类的sayHello()方法

        //反射机制调用该方法：
        //1.实例化对象(反射)
        Class cls = Class.forName("reflect.Person");
        Object o = cls.newInstance();
        //2.获取Method对象
        Method method = cls.getMethod("sayHello");//通过Class对象cls来获取方法,参数传入调用的函数名字
        /**
         *   Method的重要方法：.invoke();  invoke的意思是调用
         *   可接收可以不接收，看调用的函数的返回值是void就不用接收，默认返回Object型
         *   该方法的参数有两类：
         *   1.传入一个你所分析类的对象，这个对象可以由构造器中的方法newInstance()来创建，再直接传入方法所需的形参
         *   2.如果是无参方法，就只传入所分析类的对象
         */
        method.invoke(o); //p.sayHello

        Method method1 = cls.getMethod("function", int.class);
        method1.invoke(o,2); //p.function(2)
    }
}
